﻿using System;
using System.Collections.Generic;
using System.Text;

namespace Slc.Core.Enums
{
    #region :.Language
    /// <summary>
    /// 语言
    /// </summary>
    public enum Language
    {
        /// <summary>
        /// 英文
        /// </summary>
        EN_US,
        /// <summary>
        /// 中文（默认值）
        /// </summary>
        ZH_CN,
        /// <summary>
        /// 中文（台湾）
        /// </summary>
        ZH_TW,
        /// <summary>
        /// 中文（香港）
        /// </summary>
        ZH_HK
    }
    /// <summary>
    /// 语言的类型名称
    /// </summary>
    public static class LanguageHelper
    {
        public static string GetName(Language type)
        {
            string result = "zh_CN";
            switch (type)
            {
                case Language.EN_US:
                    result = "en_US";
                    break;
                case Language.ZH_CN:
                    result = "zh_CN";
                    break;
                case Language.ZH_TW:
                    result = "zh_TW";
                    break;
                case Language.ZH_HK:
                    result = "zh_HK";
                    break;
                default:
                    result = "zh_CN";
                    break;
            }
            return result;
        }
    }
    #endregion

    #region :.数据库类型
    /// <summary>
    /// 数据库类型
    /// </summary>
    public enum DataDbType
    {
        /// <summary>
        /// MS SQLServer
        /// </summary>
        SQLSERVER,
        /// <summary>
        /// Oracle
        /// </summary>
        ORACLE,
        /// <summary>
        /// MySql
        /// </summary>
        MYSQL,
        /// <summary>
        /// Access
        /// </summary>
        ACCESS,
        /// <summary>
        /// SQLServerCe
        /// </summary>
        SQLSERVERCE,
        /// <summary>
        /// DB2
        /// </summary>
        DB2,
        /// <summary>
        /// Sysbase
        /// </summary>
        SYSBASE,
        /// <summary>
        /// SQLite
        /// </summary>
        SQLITE,
        /// <summary>
        /// PostgreSQL
        /// </summary>
        POSTGRESQL,
        /// <summary>
        /// 未知数据库类型
        /// </summary>
        UNKNOWN = -1
    }

    public static class DataDbTypeHelper
    {
        public static string GetName(DataDbType type)
        {
            string result = string.Empty;
            switch (type)
            {
                case DataDbType.SQLSERVER:
                    result = "SQLServer";
                    break;
                case DataDbType.ORACLE:
                    result = "Oracle";
                    break;
                case DataDbType.MYSQL:
                    result = "MySql";
                    break;
                case DataDbType.ACCESS:
                    result = "Access";
                    break;
                case DataDbType.DB2:
                    result = "DB2";
                    break;
                case DataDbType.POSTGRESQL:
                    result = "PostgreSQL";
                    break;
                case DataDbType.SYSBASE:
                    result = "Sysbase";
                    break;
                case DataDbType.SQLITE:
                    result = "SQLite";
                    break;
                case DataDbType.SQLSERVERCE:
                    result = "SQLServerCe";
                    break;
                default:
                    result = "UnKnown";
                    break;
            }
            return result;
        }
    }
    #endregion

    #region :.数据库兼容版本

    /// <summary>
    /// 数据库兼容版本，暂时用于数据库分页，其它数据库差异可以扩展
    /// </summary>
    public enum DbVersion
    {
        MSSQL2000,
        MSSQL2005,
        MSSQL2008
    }
    #endregion

    #region :.数据库对象类型
    public enum Db_DataType
    {
        /// <summary>
        /// 数据表
        /// </summary>
        Table,
        /// <summary>
        /// 视图
        /// </summary>
        View,
        /// <summary>
        /// 存储过程
        /// </summary>
        StoredProcedure,
        /// <summary>
        /// 存储过程，将从SQL-MAP实体配置文件中使用用户定义的存储过程名称和参数信息，需要采用SQL-MAP的参数语法
        /// </summary>
        SqlMap
    }
    #endregion

    #region :.参数类型 ,查询类型,结果类型,实体对象字段比较枚举
    /// <summary>
    /// 参数类型
    /// </summary>
    /// <remarks></remarks>
    public enum enumParamType
    {
        /// <summary>
        /// 参数
        /// </summary>
        /// <remarks></remarks>
        DataParameter,
        /// <summary>
        /// 替换文本
        /// </summary>
        /// <remarks></remarks>
        ReplacedText
    }

    /// <summary>
    /// 查询类型
    /// </summary>
    /// <remarks></remarks>
    public enum enumQueryType
    {
        Select,
        Update,
        Delete,
        Create
    }


    /// <summary>
    /// 结果类型
    /// </summary>
    /// <remarks></remarks>
    public enum enumResultClass
    {
        /// <summary>
        /// 值类型，比如Integer，String 等
        /// </summary>
        /// <remarks></remarks>
        ValueType,
        /// <summary>
        /// 数据集
        /// </summary>
        /// <remarks></remarks>
        DataSet,
        /// <summary>
        /// 实体对象，指定该类型后，需要指定 ResuleMap 属性
        /// </summary>
        /// <remarks></remarks>
        EntityObject,
        /// <summary>
        /// 实体对象集合，指定该类型后，需要指定 ResuleMap 属性
        /// </summary>
        /// <remarks></remarks>
        EntityList,
        /// <summary>
        /// 默认类型，根据配置决定默认生成哪一种结果类型
        /// </summary>
        /// <remarks></remarks>
        Default
    }

    /// <summary>
    /// 实体对象字段比较枚举
    /// </summary>
    /// <remarks></remarks>
    public enum enumCompare
    {
        /// <summary>
        /// 大于
        /// </summary>
        /// <remarks></remarks>
        Greater,
        /// <summary>
        /// 不大于
        /// </summary>
        /// <remarks></remarks>
        NoGreater,
        /// <summary>
        /// 小于
        /// </summary>
        /// <remarks></remarks>
        Smaller,
        /// <summary>
        /// 不小于
        /// </summary>
        /// <remarks></remarks>
        NoSmaller,
        /// <summary>
        /// 等于
        /// </summary>
        /// <remarks></remarks>
        Equal,
        /// <summary>
        /// 不等于
        /// </summary>
        /// <remarks></remarks>
        NotEqual,
        /// <summary>
        /// 类似于
        /// </summary>
        /// <remarks></remarks>
        Like,
        /// <summary>
        /// 空
        /// </summary>
        IsNull,
        /// <summary>
        /// 非空
        /// </summary>
        IsNotNull
    }
    /// <summary>
    /// 比较类别
    /// </summary>
    public enum CompareType
    {
        /// <summary>
        /// 大于
        /// </summary>
        Greater,
        /// <summary>
        /// 不大于（小于或等于）
        /// </summary>
        LessThanOrEqual,
        /// <summary>
        /// 小于
        /// </summary>
        LessThan,
        /// <summary>
        /// 不小于（大于或等于）
        /// </summary>
        GreaterThanOrEqual,
        /// <summary>
        /// 相等
        /// </summary>
        Equal,
        /// <summary>
        /// 不等于
        /// </summary>
        NotEqual,
        /// <summary>
        /// 类似于
        /// </summary>
        Like,
        /// <summary>
        /// IS NULL / IS NOT NULL
        /// </summary>
        IS,
        /// <summary>
        /// IN 查询
        /// </summary>
        IN,
        /// <summary>
        /// Not In 查询
        /// </summary>
        NotIn,
        /// <summary>
        /// IS NOT NULL
        /// </summary>
        IsNot,
        /// <summary>
        /// BETWEEN 在某两个值之间
        /// </summary>
        Between

    }

    /// <summary>
    /// 条件表达式逻辑符号
    /// </summary>
    public enum CompareLogic
    {
        /// <summary>
        /// 逻辑 与
        /// </summary>
        AND,
        /// <summary>
        /// 逻辑 或
        /// </summary>
        OR,
        /// <summary>
        /// 逻辑 非
        /// </summary>
        NOT
    }
    #endregion

    #region :.ParamMapType
    /// <summary>
    /// 参数结构
    /// </summary>
    /// <remarks></remarks>
    public struct ParamMapType
    {
        public string ParamName;
        public System.TypeCode TypeCode;
    }
    #endregion

    #region :.SqlServer数据锁
    /// <summary>
    /// SqlServer上的锁类型枚举。请注意，OQL应用这个枚举之后将只能在SqlServer上面使用。
    /// </summary>
    public enum SqlServerLock
    {
        /// <summary>
        /// 在该表上保持共享锁，直到整个事务结束，而不是在语句执行完立即释放所添加的锁。
        /// </summary>
        HOLDLOCK,
        /// <summary>
        /// 不添加共享锁和排它锁，当这个选项生效后，可能读到未提交读的数据或“脏数据”，这个选项仅仅应用于SELECT语句
        /// </summary>
        NOLOCK,
        /// <summary>
        /// 指定添加页锁（否则通常可能添加表锁）
        /// </summary>
        PAGLOCK,
        /// <summary>
        /// 用与运行在提交读隔离级别的事务相同的锁语义执行扫描。默认情况下，SQL Server 2000 在此隔离级别上操作
        /// </summary>
        READCOMMITTED,
        /// <summary>
        /// 跳过已经加锁的数据行，这个选项将使事务读取数据时跳过那些已经被其他事务锁定的数据行，而不是阻塞直到其他事务释放锁，READPAST仅仅应用于READ COMMITTED隔离性级别下事务操作中的SELECT语句操作
        /// </summary>
        READPAST,
        /// <summary>
        /// 等同于NOLOCK
        /// </summary>
        READUNCOMMITTED,
        /// <summary>
        /// 设置事务为可重复读隔离性级别
        /// </summary>
        REPEATABLEREAD,
        /// <summary>
        /// 使用行级锁，而不使用粒度更粗的页级锁和表级锁
        /// </summary>
        ROWLOCK,
        /// <summary>
        /// 用与运行在可串行读隔离级别的事务相同的锁语义执行扫描。等同于 HOLDLOCK。
        /// </summary>
        SERIALIZABLE,
        /// <summary>
        /// 指定使用表级锁，而不是使用行级或页面级的锁，SQL Server在该语句执行完后释放这个锁，而如果同时指定了HOLDLOCK，该锁一直保持到这个事务结束
        /// </summary>
        TABLOCK,
        /// <summary>
        /// 指定在表上使用排它锁，这个锁可以阻止其他事务读或更新这个表的数据，直到这个语句或整个事务结束
        /// </summary>
        TABLOCKX,
        /// <summary>
        /// 指定在读表中数据时设置更新 锁（update lock）而不是设置共享锁，该锁一直保持到这个语句或整个事务结束，使用UPDLOCK的作用是允许用户先读取数据（而且不阻塞其他用户读数据），并且保证在后来再更新数据时，这一段时间内这些数据没有被其他用户修改
        /// </summary>
        UPDLOCK,
        /// <summary>
        /// 未知（OQL默认）
        /// </summary>
        UNKNOW
    }
    #endregion

    #region :.委托定义

    public delegate TResult MyFunc<T, TResult>(T arg);

    public delegate void MyAction<T1, T2>(T1 arg1, T2 arg2);
    #endregion
}